package com.swak.entity;

import java.io.Serializable;

import com.swak.utils.StringUtils;

import lombok.Getter;
import lombok.Setter;
import lombok.experimental.Accessors;

/**
 * 分页参数
 *
 * @author lifeng
 */
@Getter
@Setter
@Accessors(chain = true)
public class Parameters implements Serializable {

	private static final long serialVersionUID = 1L;
	public static final int DEFAULT_PAGE_INDEX = 1;
	public static final int DEFAULT_PAGE_SIZE = 15;
	public static final int NO_PAGINATION = -1;

	private int pageIndex;
	private int pageSize;
	private int recordCount = -1;

	/**
	 * 排序字段 -- 舊版排序字段
	 */
	private String sortField;
	private String sortType;

	/**
	 * 新版排序字段:
	 * 
	 * 排序字段在前,排序類型在后(可无);
	 * 
	 * field;field:type
	 * field:type;field:type
	 */
	private String orderBy;

	/**
	 * 以默认当前页面和页面大小构造一个分页对象。 其中，默认当前页数为1，默认页面大小为 15。
	 */
	public Parameters() {
		this.pageIndex = DEFAULT_PAGE_INDEX;
		this.pageSize = DEFAULT_PAGE_SIZE;
	}

	/**
	 * 以指定的当前页面页数和页面大小构造一个分页对象。
	 *
	 * @param pageIndex 当前页数，若参数值不大于0，则使用默认值 1。
	 * @param pageSize  页面大小，若参数值不大于0，则使用默认值 10。
	 */
	public Parameters(int pageIndex, int pageSize, int recordCount) {
		this.pageIndex = pageIndex > 0 ? pageIndex : DEFAULT_PAGE_INDEX;
		this.pageSize = pageSize > 0 ? pageSize : DEFAULT_PAGE_SIZE;
		this.recordCount = recordCount;
	}

	public int getPageCount() {
		if (recordCount == 0) {
			return 0;
		}
		return recordCount % pageSize > 0 ? ((recordCount / pageSize) + 1) : (recordCount / pageSize);
	}

	public boolean hasMore() {
		return this.getPageCount() > this.pageIndex;
	}

	/**
	 * 属性转换为: 这是收集数据库传入的排序字段;
	 * -- 需要做转换
	 *
	 * @param defaulOrder 排序参数
	 * @return 排序条件
	 */
	public String orderBy(String defaulOrder) {
		StringBuilder orderBy = new StringBuilder();
		if (StringUtils.isNotBlank(this.getSortField())) {
			orderBy.append(StringUtils.convertProperty2Column(this.getSortField()));
			if (StringUtils.isNotBlank(this.getSortType())) {
				orderBy.append(" ").append(StringUtils.upperCase(this.getSortType()));
			}
		}
		if (orderBy.length() == 0 && StringUtils.isNotBlank(defaulOrder)) {
			orderBy.append(defaulOrder);
		}
		return orderBy.toString();
	}
}